package com.gosophia.dataDictionary.service;

import java.util.List;

import com.gosophia.commons.OrderCondition;
import com.gosophia.commons.Page;
import com.gosophia.commons.exception.BusinessException;
import com.gosophia.commons.exception.ConcurrencyException;
import com.gosophia.dataDictionary.entity.DataEntry;
import com.gosophia.dataDictionary.entity.DataValue;


/**
 * 数据字典管理service接口
 * 
 * @author tianchunyu
 * @date 2010-8-4
 */


public interface DataDictionaryService {

    /**
     * 模糊查询所有符合条件的词条集合（分页）
     * 
     * @param pageNo
     *            返回数据的页码 必须大于0
     * @param pageSize
     *            每页数据行数 必须大于0
     * @param propertyFilters
     *            查询条件集合
     * @param searchCon
     *            模糊查询条件  
     * @param orderConditions
     *            排序方式集合
     * @return 返回符合分页条件的所有词条集合
     */
    public Page<DataEntry> findDataEntriesByPage(int pageNo, int pageSize,String searchCon,
            List<OrderCondition> orderConditions);

    /**
     * 根据entryId查找DataEntry实体
     * 
     * @param entryId不能为null
     * @return 根据entryId查到的DataEntry实体，如果entryId不存在返回null
     */
    public DataEntry findDataEntryById(Long entryId);

    /**
     * 根据词条Id返回启用的数据值集合
     * 
     * @param entryId
     *            不能为null
     * @return 返回根据词条Id查找的启用数据值集合（按排序号排序）
     * @throws ConcurrencyException 当对象不存在时，抛出ConcurrencyException
     */
    public List<DataValue> findEnabledDataValueByEntryId(Long entryId);

    /**
     * 根据数据值id查找对应的数据值
     * 
     * @param dataValueId
     *            不能为null
     * @return 返回数据值id对应的数据值
     * 
     * @throws ConcurrencyException 当对象不存在时，抛出ConcurrencyException
     */
    public DataValue findDataValueByDataValueId(Long dataValueId);

    /**
     * 根据词条id和数据值的key查询数据值
     * 
     * @param entryId
     *            不能为null
     * @param key
     *            不能为null
     * @return 返回根据词条id和数据值的key查询数据值，如果不存在返回null
     */
    public DataValue findDataValueByEntryIdAndKey(Long entryId, String key);

    /**
     * 添加数据值
     * 
     * @param dataValue
     *            不能为null ，dataValue.dataValueId必须为null
     * @throws BusinessException
     *             ,当同一词条下的dataValue.value重复或dataValue.key重复时
     */
    public void addDataValue(DataValue dataValue,Long toId) throws BusinessException;

    /**
     * 修改数据值
     * 
     * @param dataValue
     *            不能为null ，dataValue.dataValueId不能为null
     * @throws BusinessException
     *             ,当同一词条下的dataValue.value重复或dataValue.key重复时
     */
    public void updateDataValue(DataValue dataValue) throws BusinessException;

    /**
     * 删除数据值
     * 
     * @param dataValueId
     *            不能为null;
     * @param version
     *            不能为null
     * @throws BusinessException
     *             ，当有外键引用此值时
     */
    public void removeDataValue(Long dataValueId, Long version)
            throws BusinessException,ConcurrencyException;
    
    /**
     * 根据词条名称查找启用的数据值
     * @param entryName 不能为null
     * @return 符合条件的数据值列表，没有数据返回null
     */
    public List<DataValue> findEnabledDataValueByEntryName(String entryName);
    
    /**
     * 根据词条名称和键值查找数据值
     * @param entryName 不能为null
     * @param key 不能为null
     * @return 符合条件的数据值，没有数据返回null
     */
    public DataValue findDataValueByEntryNameAndKey(String entryName, String key);
      
    /**
     * 删除数据值实体
     * @param dataValue 不能为null
     * @throws BusinessException 当删除失败时
     */
    public void removeDataValue(DataValue dataValue)throws BusinessException;
    
    /**
     * 移动数据值（将fromId对应的数据值排序号修改为toId对应的数据值排序号+1，其它影响到的数据值做相应移动）
     * @param fromId 不能为null
     * @param toId  不能为null
     * @param entryId  不能为null
     */
    public void moveDataValue(Long fromId,Long toId,Long entryId);
    
    
}
// /:~
